У нас вы можете скачать книгу caller id system инструкция в fb2, txt, PDF, EPUB, doc, rtf, jar, djvu, lrf!
The attribute on a return value also has additional semantics described below. The caller shares the responsibility with the callee for ensuring that these requirements are met.
For further details, please see the discussion of the NoAlias response in alias analysis. Note that this definition of noalias is intentionally similar to the definition of restrict in C99 for function arguments. Furthermore, the semantics of the noalias attribute on return values are stronger than the semantics of the attribute when used on function arguments. On function return values, the noalias attribute indicates that the function acts like a system memory allocation function, returning a pointer to allocated storage disjoint from the storage for any other object accessible to the caller.
This attribute is motivated to model and optimize Swift error handling. It can be applied to a parameter with pointer to pointer type or a pointer-sized alloca. At the call site, the actual argument that corresponds to a swifterror parameter has to come from a swifterror alloca or the swifterror parameter of the caller. A swifterror value either the parameter or the alloca can only be loaded and stored from, or used as a swifterror argument.
This is not a valid attribute for return values and can only be applied to one parameter. These constraints allow the calling convention to optimize access to swifterror variables by associating them with a specific register at call boundaries rather than placing them in memory. Since this does change the calling convention, a function which uses the swifterror attribute on a parameter is not ABI-compatible with one which does not. These constraints also allow LLVM to assume that a swifterror argument does not alias any other memory visible within a function and that a swifterror alloca passed as an argument does not escape.
The supported values of name includes those built in to LLVM and any provided by loaded plugins. Specifying a GC strategy will cause the compiler to alter its output in order to support the named garbage collection algorithm.
Note that LLVM itself does not contain a garbage collector, this functionality is restricted to generating machine code which can interoperate with a collector provided externally. The purpose of this feature is to allow frontends to associate language-specific runtime metadata with specific functions and make it available through the function pointer while still allowing the function pointer to be called. This implies that the IR symbol points just past the end of the prefix data.
For instance, take the example of a function annotated with a single i32 ,. The function will be placed such that the beginning of the prefix data is aligned. A function may have prefix data but no body. The prologue attribute allows arbitrary code encoded as bytes to be inserted prior to the function body. This can be used for enabling function hot-patching and instrumentation. To maintain the semantics of ordinary function calls, the prologue data must have a particular format.
This allows the inliner and other passes to reason about the semantics of the function definition without needing to reason about the prologue data. Obviously this makes the format of the prologue data highly target dependent. A trivial example of valid prologue data for the x86 architecture is i8 , which encodes the nop instruction:. A function may have prologue data but no body. The personality attribute permits functions to specify what function to use for exception handling.
Attribute groups are groups of attributes that are referenced by objects within the IR. They are important for keeping. In the degenerative case of a. An attribute group is a module-level object. An object may refer to more than one attribute group. In that situation, the attributes from the different groups are merged. Function attributes are set to communicate additional information about a function. Function attributes are considered to be part of the function, not of the function type, so functions with different function attributes can have the same function type.
Function attributes are simple keywords that follow the type specified. If multiple attributes are needed, they are space separated. In some parallel execution models, there exist operations that cannot be made control-dependent on any additional values. We call such operations convergent , and mark them with this attribute. When it appears on a function, it indicates that calls to this function should not be made control-dependent on additional values.
For example, the intrinsic llvm. This is particularly useful on indirect calls; without this we may treat such calls as though the target is non-convergent. The optimizer may remove the convergent attribute on functions when it can prove that the function does not execute any convergent operations.
This attribute indicates that calls to the function cannot be duplicated. A call to a noduplicate function may be moved within its parent function, but may not be duplicated within its parent function.
A function containing a noduplicate call may still be an inlining candidate, provided that the call is not duplicated by inlining. That implies that the function has internal linkage and only has one call site, so the original call is dead after inlining.
This function attribute indicates that most optimization passes will skip this function, with the exception of interprocedural optimization passes. This attribute cannot be used together with the alwaysinline attribute; this attribute is also incompatible with the minsize attribute and the optsize attribute. This attribute requires the noinline attribute to be specified on the function as well, so the function is never inlined into any caller. Only functions with the alwaysinline attribute are valid candidates for inlining into the body of this function.
This attribute tells the code generator that the code generated for this function needs to follow certain conventions that make it possible for a runtime function to patch over it later.
The exact effect of this attribute depends on its string value, for which there currently is one legal possibility:. It guarantees that the first instruction of the function will be large enough to accommodate a short jump instruction, and will be sufficiently aligned to allow being fully changed via an atomic compare-and-swap instruction.
While the first requirement can be satisfied by inserting large enough NOP, LLVM can and will try to re-purpose an existing instruction i. This attribute by itself does not imply restrictions on inter-procedural optimizations.
All of the semantic effects the patching may have to be separately conveyed via the linkage type. This attribute indicates that the function will trigger a guard region in the end of the stack.
It ensures that accesses to the stack must be no further apart than the size of the guard region to a previous access of the stack.
It takes one required string value, the name of the stack probing function that will be called. If a function that has a "probe-stack" attribute is inlined into a function with another "probe-stack" attribute, the resulting function has the "probe-stack" attribute of the caller.
If a function that has a "probe-stack" attribute is inlined into a function that has no "probe-stack" attribute at all, the resulting function has the "probe-stack" attribute of the callee. On a function, this attribute indicates that the function computes its result or decides to unwind an exception based strictly on its arguments, without dereferencing any pointer arguments or otherwise accessing any mutable state e.
It does not write through any pointer arguments including byval arguments and never changes any state visible to callers. On an argument, this attribute indicates that the function does not dereference that pointer argument, even though it may read or write the memory that the pointer points to if accessed through other pointers. On a function, this attribute indicates that the function does not write through any pointer arguments including byval arguments or otherwise modify any state e.
It may dereference pointer arguments and read state that may be set in the caller. A readonly function always returns the same value or unwinds an exception identically when called with the same set of arguments and global state. On an argument, this attribute indicates that the function does not write through this pointer argument, even though it may write to the memory that the pointer points to.
This attribute controls the behavior of stack probes: It defines the size of the guard region. It ensures that if the function may use more stack space than the size of the guard region, stack probing sequence will be emitted. It takes one required integer value, which is by default. If a function that has a "stack-probe-size" attribute is inlined into a function with another "stack-probe-size" attribute, the resulting function has the "stack-probe-size" attribute that has the lower numeric value.
If a function that has a "stack-probe-size" attribute is inlined into a function that has no "stack-probe-size" attribute at all, the resulting function has the "stack-probe-size" attribute of the callee.
On a function, this attribute indicates that the function may write to but does not read from memory. On an argument, this attribute indicates that the function may write to but does not read through this pointer argument even though it may read from the memory that the pointer points to.
This attribute indicates that SafeStack protection is enabled for this function. This attribute indicates that the function should emit a stack smashing protector. A heuristic is used to determine if a function needs stack protectors or not. The heuristic used will enable protectors for functions with:. Variables that are identified as requiring a protector will be arranged on the stack such that they are adjacent to the stack protector guard.
This attribute indicates that the function should always emit a stack smashing protector. This overrides the ssp function attribute. The specific layout rules are:. This attribute causes a strong heuristic to be used when determining if a function needs stack protectors. The strong heuristic will enable protectors for functions with:.
Attributes may be set to communicate additional information about a global variable. Unlike function attributes , attributes on a global variable are grouped into a single attribute group. Operand bundles are tagged sets of SSA values that can be associated with certain LLVM instructions currently only call s and invoke s. In a way they are like metadata, but dropping them is incorrect and will change program semantics. This reflects the fact that the operand bundles are conceptually a part of the call or invoke , not the callee being dispatched to.
Operand bundles are a generic mechanism intended to support runtime-introspection-like functionality for managed languages.
While the exact semantics of an operand bundle depend on the bundle tag, there are certain limitations to how much the presence of an operand bundle can influence the semantics of a program. As long as the behavior of an operand bundle is describable within these restrictions, LLVM does not need to have special knowledge of the operand bundle to not miscompile programs containing it. Deoptimization operand bundles are characterized by the "deopt" operand bundle tag.
There can be at most one "deopt" operand bundle attached to a call site. Exact details of deoptimization is out of scope for the language reference, but it usually involves rewriting a compiled frame into a set of interpreted frames. Deoptimization operand bundles do not capture their operands except during deoptimization, in which case control will not be returned to the compiled frame. The inliner knows how to inline through calls that have deoptimization operand bundles.
Funclet operand bundles are characterized by the "funclet" operand bundle tag. These operand bundles indicate that a call site is within a particular funclet.
There can be at most one "funclet" operand bundle attached to a call site and it must have exactly one bundle operand. Similarly, if no funclet EH pads have been entered-but-not-yet-exited, executing a call or invoke with a "funclet" bundle is undefined behavior. GC transition operand bundles are characterized by the "gc-transition" operand bundle tag. These operand bundles mark a call as a transition between a function with one GC strategy to a function with a different GC strategy.
If coordinating the transition between GC strategies requires additional code generation at the call site, these bundles may contain any values that are needed by the generated code. For more details, see GC Transitions. These blocks are internally concatenated by LLVM and treated as a single unit, but may be separated in the. The syntax is very simple:. The strings can contain any character by escaping non-printable characters. A module may specify a target specific data layout string that specifies how data is to be laid out in memory.
The syntax for the data layout is simply:. Each specification starts with a letter and may include other information after the letter to define some aspect of the data layout. The specifications accepted are as follows:. If present, specifies that llvm names are mangled in the output. The mangling style options are. If omitted, the preceding: When constructing the data layout for a given target, LLVM starts with a default set of specifications which are then possibly overridden by the specifications in the datalayout keyword.
The default specifications are given in this list:. The function of the data layout string may not be what you expect. Notably, this is not a specification from the frontend of what alignment the code generator should use. Instead, if specified, the target data layout is required to match what the ultimate code generator expects. This string is used by the mid-level optimizers to improve code, and this only works if it matches what the ultimate code generator uses.
There is no way to generate IR that does not embed this target-specific detail into the IR. A module may specify a target triple string that describes the target host. The syntax for the target triple is simply:.
The canonical forms are:. This information is passed along to the backend so that it generates code for the proper architecture. Any memory access must be done through a pointer value associated with an address range of the memory access, otherwise the behavior is undefined. Pointer values are associated with address ranges according to the following rules:. The result type of a load merely indicates the size and alignment of the memory from which to load, as well as the interpretation of the value.
The first operand type of a store similarly only indicates the size and alignment of the store. Metadata may be used to encode additional information which specialized optimization passes may use to implement type-based alias analysis. The optimizers must not change the number of volatile operations or change their order of execution relative to other volatile operations. The optimizers may change the order of volatile operations relative to non-volatile operations.
IR-level volatile loads and stores cannot safely be optimized into llvm. Platforms may rely on volatile loads and stores of natively supported data width to be executed as single instruction. For example, in C this holds for an l-value of volatile primitive type with native hardware support, but not necessarily for aggregate types.
The frontend upholds these expectations, which are intentionally unspecified in the IR. Note that program order does not introduce happens-before edges between a thread and signals executing inside that thread. For the purposes of this section, initialized globals are considered to have a write of the initializer which is atomic and happens before any other read or write of the memory in question.
For each byte of a read R, R byte may see any write to the same byte, except:. R returns the value composed of the series of bytes it read. This implies that some bytes within the value may be undef without the entire value being undef.
Note that in cases where none of the atomic intrinsics are used, this model places only one restriction on IR transformations on top of what is required for single-threaded execution: Specifically, in the case where another thread might write to and read from an address, introducing a store can change a load that may see exactly one write into a load that may see multiple writes.
Atomic instructions cmpxchg , atomicrmw , fence , atomic load , and atomic store take ordering parameters that determine which other atomic instructions on the same address they synchronize with.
The default LLVM floating-point environment assumes that floating-point instructions do not have side effects. Results assume the round-to-nearest rounding mode. No floating-point exception state is maintained in this environment. Therefore, there is no attempt to create or preserve invalid operation SNaN or division-by-zero exceptions in these examples:.
The benefit of this exception-free assumption is that floating-point operations may be speculated freely without any other fast-math relaxations to the floating-point model. Code that requires different behavior than this should use the Constrained Floating-Point Intrinsics. LLVM IR floating-point operations fadd , fsub , fmul , fdiv , frem , fcmp and call may use the following flags to enable otherwise unsafe floating-point transformations.
Use-list directives encode the in-memory order of each use-list, allowing the order to be recreated. Use-list directives may appear at function scope or global scope. They are not instructions, and have no effect on the semantics of the IR. The source filename string is set to the original module identifier, which will be the name of the compiled source file when compiling from source through the clang front end, for example. It is then preserved through the IR and bitcode. This is currently necessary to generate a consistent unique global identifier for local functions used in profile data, which prepends the source file name to the local function name.
The LLVM type system is one of the most important features of the intermediate representation. Being typed enables a number of optimizations to be performed on the intermediate representation directly, without having to do extra analyses on the side before the transformation.
A strong type system makes it easier to read the generated code and enables novel analyses and transformations that are not feasible to perform on normal three address code representations.
The function type can be thought of as a function signature. It consists of a return type and a list of formal parameter types. The return type of a function type is a void type or first class type — except for label and metadata types. Optionally, the parameter list may include a type Variable argument functions can access their arguments with the variable argument handling intrinsic functions.
The first class types are perhaps the most important. Values of these types are the only ones which can be produced by instructions.
The integer type is a very simple type that simply specifies an arbitrary bit width for the integer type desired. Any bit width from 1 bit to 2 23 -1 about 8 million can be specified. The number of bits the integer will occupy is specified by the N value. The binary format of half, float, double, and fp correspond to the IEEE specifications for binary16, binary32, binary64, and binary respectively.
The operations allowed on it are quite limited: There are no arrays, vectors or constants of this type. The pointer type is used to specify memory locations. Pointers are commonly used to reference objects in memory. Pointer types may have an optional address space attribute defining the numbered address space where the pointed-to object resides.
The default address space is number zero. The semantics of non-zero address spaces are target-specific. A vector type is a simple derived type that represents a vector of elements. Vector types are used when multiple primitive data are operated in parallel using a single instruction SIMD. A vector type requires a size number of elements and an underlying primitive data type. Vector types are considered first class. The number of elements is a constant integer value larger than 0; elementtype may be any integer, floating-point or pointer type.
Vectors of size zero are not allowed. The token type is used when a value is associated with an instruction but all uses of the value must not attempt to introspect or obscure it. As such, it is not appropriate to have a phi or select of type token. The metadata type represents embedded metadata. No derived types may be created from metadata except for function arguments.
Aggregate Types are a subset of derived types that can contain multiple member types. Arrays and structs are aggregate types. Vectors are not considered to be aggregate types. The array type is a very simple derived type that arranges elements sequentially in memory.
The array type requires a size number of elements and an underlying data type. The number of elements is a constant integer value; elementtype may be any type with a size.
There is no restriction on indexing beyond the end of the array implied by a static type though there are restrictions on indexing beyond the bounds of an allocated object in some cases. The structure type is used to represent a collection of data members together in memory. The elements of a structure may be any type that has a size. In non-packed structs, padding between field types is inserted as defined by the DataLayout string in the module, which is required to match what the underlying code generator expects.
A literal structure is defined inline with other types e. Literal types are uniqued by their contents and can never be recursive or opaque since there is no way to write one. Identified types can be recursive, can be opaqued, and are never uniqued. Opaque structure types are used to represent named structure types that do not have a body specified. This corresponds for example to the C notion of a forward declared structure. LLVM has several different basic types of constants.
This section describes them all and their syntax. The one non-intuitive notation for constants is the hexadecimal form of floating-point constants. The only time hexadecimal floating-point constants are required and the only time that they are generated by the disassembler is when a floating-point constant must be emitted but it cannot be represented as a decimal floating-point number in a reasonable number of digits.
When using the hexadecimal form, constants of types half, float, and double are represented using the digit form shown above which matches the IEEE representation for double ; half and float values must, however, be exactly representable as IEEE half and single precision, respectively.
Hexadecimal format is always used for long double, and there are three forms of long double. The bit format used by x86 is represented as 0xK followed by 20 hexadecimal digits.
The bit format used by PowerPC two adjacent doubles is represented by 0xM followed by 32 hexadecimal digits. Long doubles will only work if they match the long double format on your target. All hexadecimal formats are big-endian sign bit at the left. Complex constants are a potentially recursive combination of simple constants and smaller complex constants. The addresses of global variables and functions are always implicitly valid link-time constants. These constants are explicitly referenced when the identifier for the global is used and always have pointer type.
For example, the following is a legal LLVM file:. Undefined values are useful because they indicate to the compiler that the program is well defined no matter what value is used. This gives the compiler more freedom to optimize. Here are some examples of potentially surprising transformations that are valid in pseudo IR:. This is safe because all of the output bits are affected by the undef bits. Any output bit can have a zero or one depending on the input bits.
These logical operations have bits that are not always affected by the input. Instead, the value is logically read from arbitrary registers that happen to be around when needed, so the value is not necessarily consistent over time. These examples show the crucial difference between an undefined value and undefined behavior.
However, in the second example, we can make a more aggressive assumption: Since a divide by zero has undefined behavior , we are allowed to assume that the operation does not execute at all. This allows us to delete the divide and all code after it. A store of an undefined value can be assumed to not have any effect; we can assume that the value is overwritten with bits that happen to match what was already there. However, a store to an undefined location could clobber arbitrary memory, therefore, it has undefined behavior.
Poison values are similar to undef values , however they also represent the fact that an instruction or constant expression that cannot evoke side effects has nevertheless detected a condition that results in undefined behavior. There is currently no way of representing a poison value in the IR; they only exist when produced by operations such as add with the nsw flag.
Poison values have the same behavior as undef values , with the additional effect that any instruction that has a dependence on a poison value has undefined behavior.
Taking the address of the entry block is illegal. Pointer equality tests between labels addresses results in undefined behavior — though, again, comparison against null is ok, and no label is equal to the null pointer.
This may be passed around as an opaque pointer sized value as long as the bits are not inspected. This allows ptrtoint and arithmetic to be performed on these values so long as the original value is reconstituted before the indirectbr instruction. Finally, some targets may provide defined semantics when using the value as the operand to an inline assembly, but that is target specific. Constant expressions are used to allow expressions involving other constants to be used as constants.
Constant expressions may be of any first class type and may involve any LLVM operation that does not have side effects e. The following is the syntax for constant expressions:. This value represents the inline assembler as a template string containing the instructions to emit , a list of operand constraints stored as a string , a flag that indicates whether or not the inline asm expression has side effects, and a flag indicating whether the function containing the asm needs to align its stack conservatively.
However, to be clear, the syntax of the template and constraint strings described here is not the same as the syntax accepted by GCC and Clang, and, while most constraint letters are passed through as-is by Clang, some get translated to other codes when converting from the C source to the LLVM assembly.
Inline assembler expressions may only be used as the callee operand of a call or an invoke instruction. Thus, typically we have:. Inline asms with side effects not visible in the constraint list must be marked as having side effects.
In some cases inline asms will contain code that will not work unless the stack is aligned in some way, such as calls or SSE instructions on x86, yet will not contain code that does that alignment within the asm.
Inline asms also support using non-standard assembly dialects. The assumed dialect is ATT. Currently, ATT and Intel are the only supported dialects. The constraint list is a comma-separated string, each element containing one or more constraint codes. There are three different types of constraints, which are distinguished by a prefix symbol in front of the constraint code: Output, Input, and Clobber.
The constraints must always be given in that order: They cannot be intermingled. This indicates that the assembly will write to this operand, and the operand will then be made available as a return value of the asm expression. Output constraints do not consume an argument from the call instruction.
Except, see below about indirect outputs. Normally, it is expected that no output locations are written to by the assembly expression until all of the inputs have been read.
As such, LLVM may assign the same register to an output and an input. If this is not safe e. Input constraints do not have a prefix — just the constraint codes. Each input constraint will consume one argument from the call instruction. It is not permitted for the asm to write to any input register or memory location unless that input is tied to an output.
Note also that multiple inputs may all be assigned to the same register, if LLVM can determine that they necessarily all contain the same value. In that case, no other input may share the same register as the input tied to the early-clobber even when the other input has the same value. You may only tie an input to an output which has a register constraint, not a memory constraint. Only a single input may be tied to an output.
Firstly, the registers are not guaranteed to be consecutive. So, on those architectures that have instructions which operate on multiple consecutive instructions, this is not an appropriate way to support them. The hardware then loads into both the named register, and the next register. This feature of inline asm would not be useful to support that. A few of the targets provide a template string modifier allowing explicit access to the second register of a two-register operand e.
On such an architecture, you can actually access the second allocated register yet, still, not any subsequent ones. This indicates that the asm will write to or read from the contents of an address provided as an input argument. Note that in this way, indirect outputs act more like an input than an output: This is most typically used for memory constraint, e. It is also possible to use an indirect register constraint, but only on output e.
This will cause LLVM to allocate a register for an output value normally, and then, separately emit a store to the address provided as input, after the provided inline asm.
I would recommend not using it. A clobber does not consume an input operand, nor generate an output. Clobbers cannot use any of the general constraint code letters — they may use only explicit register constraints, e. A Constraint Code is either a single letter e. A single constraint may include one or more than constraint code in it, leaving it up to LLVM to choose which one to use. This is included mainly for compatibility with the translation of GCC inline asm coming from clang.
There are two ways to specify alternatives, and either or both may be used in an inline asm constraint list:. Putting those together, you might have a two operand constraint string like "rm r,ri rm". This indicates that if operand 0 is r or m , then operand 1 may be one of r or i. If operand 0 is r , then operand 1 may be one of r or m.
But, operand 0 and 1 cannot both be of type m. However, the use of either of the alternatives features is NOT recommended, as LLVM is not able to make an intelligent choice about which one to use. At the point it currently needs to choose, not enough information is available to do so in a smart way. And, if given multiple registers, or multiple register classes, it will simply choose the first one. The constraint codes are, in general, expected to behave the same way they do in GCC.
The modifiers are, in general, expected to behave the same way they do in GCC. SystemZ implements only n , and does not support any of the other target-independent modifiers.
If present, the code generator will use the integer as the location cookie value when report errors through the LLVMContext error reporting mechanisms. This allows a front-end to correlate backend errors that occur with inline asm back to the source code that produced it. It is up to the front-end to make sense of the magic numbers it places in the IR.
If the MDNode contains multiple constants, the code generator will use the one that corresponds to the line of the asm that the error occurs on. LLVM IR allows metadata to be attached to instructions in the program that can convey extra information about the code to the optimizers and code generator. One example application of metadata is source-level debug information. There are two metadata primitives: Metadata does not have a type, and is not a value.
If referenced from a call instruction, it uses the metadata type. A metadata string is a string surrounded by double quotes. Metadata nodes are represented with notation similar to structure constants a comma separated list of elements, surrounded by braces and preceded by an exclamation point.
Metadata nodes can have any values as their operand. They can also occur when transformations cause uniquing collisions when metadata operands change. A named metadata is a collection of metadata nodes, which can be looked up in the module symbol table. Metadata can be used as function arguments.
Metadata can be attached to an instruction. Metadata can also be attached to a function or a global variable. Currently there is an exception for metadata attachment to globals for! Metadata attached to a module using named metadata may not be dropped, with the exception of debug metadata named metadata with the name!
More information about specific metadata nodes recognized by the optimizers and code generator is found below. Specialized metadata nodes are custom data structures in metadata as opposed to generic tuples. Their fields are labelled, and can be specified in any order. DICompileUnit nodes represent a compile unit.
Compile unit descriptors provide the root scope for objects declared in a specific compilation unit. File descriptors are defined using this scope. These descriptors are collected by a named metadata node! They keep track of global variables, type information, and imported entities declarations and namespaces. DIFile nodes represent files. Files are sometimes used in scope: Valid values for checksumkind: Вложенные запросы или определяемые пользователем функции, которые обеспечивают или предположительно обеспечивают пользовательский или системный доступ к данным.
Subqueries or user-defined functions that perform user or system data access, or are assumed to perform such access. Предполагается, что определяемые пользователем функции выполняют доступ к данным, если они не привязаны к схеме. User-defined functions are assumed to perform data access if they are not schema-bound. Столбец из представления или встроенная функция с табличным значением, если этот столбец определяется с помощью одного из следующих методов.
A column from a view or inline table-valued function when that column is defined by one of the following methods: Определяемая пользователем функция, которая осуществляет или может осуществлять доступ к пользовательским или системным данным.
A user-defined function that performs user or system data access, or is assumed to perform such access. Вычисляемый столбец, содержащий определяемую пользователем функцию, которая осуществляет доступ к пользовательским или системным данным в своем определении. A computed column that contains a user-defined function that performs user or system data access in its definition.
Вся операция является атомарной. The whole operation is atomic. Целевой объект не должен быть удаленной таблицей, представлением или обобщенным табличным выражением. The target cannot be a remote table, view, or common table expression.
Триггеры не должны быть определены на целевом объекте. Triggers cannot be defined on the target. Целевой объект не должен участвовать в репликации слиянием или обновляемых подписках для репликации транзакций. The target cannot participate in merge replication or updatable subscriptions for transactional replication.
К вложенной инструкции DML применяются следующие ограничения. The following restrictions apply to the nested DML statement: Целевой объект не должен быть удаленной таблицей или секционированным представлением. The target cannot be a remote table or partitioned view. Уведомления о запросах рассматривают инструкцию как единую сущность, и тип любого созданного сообщения будет типом вложенной инструкции DML, даже если внешняя инструкция INSERT сделала значительное изменение.
Query notifications treat the statement as a single entity, and the type of any message that is created will be the type of the nested DML, even if the significant change is from the outer INSERT statement itself. WRITE для изменения столбца nvarchar max , varchar max или varbinary max , то возвращаются полные образы значений до и после изменения, если на них есть ссылки.
When you use the. WRITE clause in the UPDATE statement to modify an nvarchar max , varchar max , or varbinary max column, the full before and after images of the values are returned if they are referenced.
Предложение OUTPUT может применяться в приложениях, которые применяют таблицы в качестве очередей или для хранения промежуточных результирующих наборов, You can use OUTPUT in applications that use tables as queues, or to hold intermediate result sets. That is, the application is constantly adding or removing rows from the table. В этом примере строка удаляется из таблицы, используемой в качестве очереди, и удаляемое значение возвращается приложению.
This example removes a row from a table used as a queue and returns the deleted values to the processing application in a single action. Можно реализовать также и другую семантику, например применение таблицы как стека.
Other semantics may also be implemented, such as using a table to implement a stack. For example, when a TRY block executes a stored procedure and an error occurs in the stored procedure, the error can be handled in the following ways: Текст содержит значения подставляемых параметров, таких как длина, имена объектов или время.
The text includes the values supplied for any substitutable parameters, such as lengths, object names, or times. Error information can be retrieved by using these functions from anywhere within the scope of the CATCH block. Например, следующий скрипт демонстрирует хранимую процедуру, которая содержит функции обработки ошибок.
For example, the following script shows a stored procedure that contains error-handling functions. Предупреждения и информационные сообщения с уровнем серьезности 10 или ниже. Warnings or informational messages that have a severity of 10 or lower. Такие запросы, как прерывания от клиента или разрыв соединения, вызванный с клиента. Attentions, such as client-interrupt requests or broken client connections.
Завершение сеанса системным администратором с помощью инструкции KILL. When the session is ended by a system administrator by using the KILL statement.