小编Joh*_*ard的帖子

PostgreSQL独特约束中的多个可空列

我们有一个遗留数据库模式,有一些有趣的设计决策.直到最近,我们才支持Oracle和SQL Server,但我们正在尝试添加对PostgreSQL的支持,这引发了一个有趣的问题.我搜索了Stack Overflow和其他互联网,我不相信这种特殊情况是重复的.

对于唯一约束中的可空列,Oracle和SQL Server的行为都相同,这实际上是在执行唯一检查时忽略NULL列.

假设我有以下表格和约束:

CREATE TABLE EXAMPLE
(
    ID TEXT NOT NULL PRIMARY KEY,
    FIELD1 TEXT NULL,
    FIELD2 TEXT NULL,
    FIELD3 TEXT NULL,
    FIELD4 TEXT NULL,
    FIELD5 TEXT NULL,
    ...
);

CREATE UNIQUE INDEX EXAMPLE_INDEX ON EXAMPLE
(
    FIELD1 ASC,
    FIELD2 ASC,
    FIELD3 ASC,
    FIELD4 ASC,
    FIELD5 ASC
);
Run Code Online (Sandbox Code Playgroud)

在Oracle和SQL Server上,保留任何可为空的列NULL将导致仅对非空列执行唯一性检查.所以以下插入只能执行一次:

INSERT INTO EXAMPLE VALUES ('1','FIELD1_DATA', NULL, NULL, NULL, NULL );
INSERT INTO EXAMPLE VALUES ('2','FIELD1_DATA','FIELD2_DATA', NULL, NULL,'FIELD5_DATA');
-- These will succeed when they should violate …
Run Code Online (Sandbox Code Playgroud)

sql postgresql null database-design unique-constraint

16
推荐指数
3
解决办法
3875
查看次数

在GCC中动态创建va_list - 可以完成吗?

我的问题vsprintf是我无法直接获取输入参数,我必须首先获取输入并将它们保存在void**,然后传递void**vsprintf()它,这对于windows来说都很好,但是当我来到64位linux时,gcc无法编译因为它不允许转换void**va_list,是否有人可以给我一些帮助我应该如何在linux下执行此操作?

我可以在GCC中动态创建va_list吗?

void getInputArgs(char* str, char* format, ...)
{
    va_list args;
    va_start(args, format);
    vsprintf(str, format, args);
    va_end(args);
}  

void process(void)
{
    char s[256];
    double tempValue;
    char * tempString = NULL;
    void ** args_ptr = NULL;
    ArgFormatType format;   //defined in the lib I used in the code
    int numOfArgs = GetNumInputArgs();  // library func used in my code

    if(numOfArgs>1)
    {
        args_ptr = (void**) malloc(sizeof(char)*(numOfArgs-1));
        for(i=2; i<numOfArgs; i++)
        {
            format …
Run Code Online (Sandbox Code Playgroud)

c gcc x86-64 variadic-functions

8
推荐指数
2
解决办法
3036
查看次数

Cmake:基于变量内容的 add_custom_command 参数

我想要一个 Cmake 函数来将一些二进制文件复制到特定位置。为此,我有以下函数定义:

function ( collect_binaries TARGET_NAME DEST_DIR )
   set ( targetsToCopy ${ARGN} )

   set ( copy_cmd "COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}\n" )

   foreach ( target ${targetsToCopy} )
      LIST( APPEND copy_cmd "COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${DEST_DIR}$<TARGET_FILE_NAME:${target}>\n")
   endforeach( target ${targetsToCopy} )

   #message( FATAL_ERROR ${copy_cmd} )
   add_custom_target( ${TARGET_NAME} )
   add_custom_command( TARGET ${TARGET_NAME} PRE_BUILD ${copy_cmd} )

endfunction( collect_binaries )
Run Code Online (Sandbox Code Playgroud)

以及以下用法:

collect_binaries( bin_copy ${PROJECT_BINARY_DIR}/out/ target_1 target_2 target3 )
Run Code Online (Sandbox Code Playgroud)

我在项目树中定义了 target_1、target_2 和 target_3。考虑到这一点,我得到了以下 Cmake 配置输出:

binary_copy.cmake:15 (add_custom_command) 处的 CMake 警告 (dev):

策略 CMP0040 未设置:add_custom_command() …

cmake

8
推荐指数
1
解决办法
4729
查看次数

为什么c ++ 17的emplace()函数不是ref-qualified?

C++ 17为一些emplace_back()类型的函数引入了一个新的函数签名(std::optional<>也有一个),但它们不是ref-qualified.这允许emplace_back()在临时和绑定到左值引用上调用,即使未扩展对象的生命周期.考虑以下:

#include <vector>
#include <optional>
#include <iostream>

struct A {
   A(int i) : i(i) { std::cout << "constructor called: " << i << '\n'; }
   ~A() { std::cout << "destructor called\n"; }

   int i;
};

int main() {
    auto & a = std::optional<A>().emplace(5);
    std::cout << "a: " << a.i << '\n';
    auto & v = std::vector<A>().emplace_back(5);
    std::cout << "v: " << v.i << '\n';

    // This fails to compile, because value() *is*
    // …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++17

5
推荐指数
1
解决办法
249
查看次数

访问者模式适用于 shared_ptr 还是原始指针?

我正在开发一个小型编译器。现在我有一个层次系统来表达抽象语法树(AST)。

class Ast{
public:
    // ...
}

class Expr : public Ast{
public:
    // ...
}

using ExprNode = shared_ptr<Expr>;

class BinaryOp : public Expr{
public:
    ExprNode lhs;
    ExprNode rhs;
}
Run Code Online (Sandbox Code Playgroud)

Ast层次系统中的所有类都使用 shared_ptr 来管理它们的成员(如果需要),例如,BinaryOp持有两个成员来表示其操作数。

我想在树上应用访问者模式来为 AST 生成 IR 代码。我的问题是,访问者应该接受原始指针作为参数,还是接受 shared_ptr 作为参数,这可能会导入shared_from_this(考虑利弊)?如果需要 shared_ptr,我应该使用按值传递还是按引用传递?


原始指针

class AstVisitor{
public:
   virtual Ast* visit(Ast* ast);
   virtual Ast* visitBinaryOp(BinaryOp* binary){
      visit(binary->lhs.get());
      visit(binary->rhs.get());
      // ...
   }
}

class Ast{
public:
    virtual Ast* accept(AstVisitor& visitor);
}

class BinaryOp:{
public:
    virtual Ast* accept(AstVisitor& visitor) …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns

4
推荐指数
1
解决办法
379
查看次数